<?php
$MEMSIZE = 512; //  объём выделяемой разделяемой памяти
$SEMKEY = 1;   //  ключ семафора
$SHMKEY = 2;   //  ключ разделяемой памяти

echo "Старт.\n";

// Создаем семафор
$sem_id = sem_get($SEMKEY, 1);
if ($sem_id === false)
{
    echo "Ошибка при создании семафора";
    exit;
}
else
    echo "Создан семафор $sem_id.\n";

// Занимаем семафор
if (! sem_acquire($sem_id))
{
    echo "Ошибка при попытке занять семафор $sem_id.\n";
    sem_remove($sem_id);
    exit;
}
else
    echo "Успешно занят семафор $sem_id.\n";

// Подключаем разделяемую память
$shm_id = shm_attach($SHMKEY, $MEMSIZE);
if ($shm_id === false)
{
    echo "Ошибка при подключении разделяемой памяти.\n";
    sem_remove($sem_id);
    exit;
}
else
    echo "Успешное подключение разделяемой памяти: $shm_id.\n";

// Пишем переменную 1
if (!shm_put_var($shm_id, 1, "Переменная 1"))
{
    echo "Ошибка при попытке записать переменную 1 в разделяемую память $shm_id.\n";

    // Овобождаем ресурсы.
    sem_remove($sem_id);
    shm_remove($shm_id);
    exit;
}
else
    echo "Переменная 1 записана в разделяемую память.\n";

// Пишем переменную 2
if (!shm_put_var($shm_id, 2, "Переменная 2"))
{
    echo "Ошибка при попытке записать переменную 2 в разделяемую память $shm_id.\n";

    // Освобождаем ресурсы.
    sem_remove($sem_id);
    shm_remove ($shm_id);
    exit;
}
else
    echo "Переменная 2 записана в разделяемую память.\n";

// Читаем переменную 1
$var1 = shm_get_var($shm_id, 1);
if ($var1 === false)
{
    echo "Ошибка при попытке прочитать переменную 1 из разделяемой памяти $shm_id, " .
         "возвращенное значение=$var1.\n";
}
else
    echo "Прочитана переменная 1=$var1.\n";

// Читаем переменную 2
$var2 = shm_get_var ($shm_id, 2);
if ($var1 === false)
{
     echo "Ошибка при попытке прочитать переменную 2 из разделяемой памяти $shm_id, " .
          "возвращенное значение=$var2.\n";
}
else
    echo "Прочитана переменная 2=$var2.\n";

// Освобождаем семафор
if (!sem_release($sem_id))
    echo "Ошибка при попытке освободить семафор $sem_id.\n";
else
    echo "Семафор $sem_id освобожден.\n";

// Удаляем сегмент разделяемой памяти
if (shm_remove ($shm_id))
    echo "Сегмент разделяемой памяти успешно удален.\n";
else
    echo "Ошибка при попытке удалить сегмент разделяемой памяти $shm_id.\n";

// Удаляем семафор.
if (sem_remove($sem_id))
    echo "Семафор успешно удален.\n";
else
    echo "Ошибка при попытке удалить семафор $sem_id.\n";

echo "Конец.\n";

?>